package quarto.controller.client.strategy;

import java.util.ArrayList;
import quarto.model.Board;
import quarto.model.Piece;

/**
 * Een slimme strategie<br />
 * - bij het kiezen van de locatie kijkt de strategie op welke plaats hij
 *   kan winnen, als dit niet mogelijk is kiest hij een willekeurige locatie<br />
 * - voor het bepalen van het stuk voor de tegenstander, kijkt de strategie
 *   of de tegenstander er mee zou kunnen winnen
 * @knows
 * - Client
 * @does
 * - Beste positie bepalen van huidige Piece van Player
 * - Beste Piece bepalen voor tegenstander
 */
public class SmartStrategy extends Strategy 
{
    /**
     * De naam van de strategie
     */
    public static final String NAME = "Slimme strategie";
    /**
     * het laatst geplaatste stuk
     */
    private Piece lastPiece;
    
    /**
     * de locatie van het laatst geplaatste stuk
     */
    private int lastLocation;
    
    /**
     * Maakt een strategie aan met een naam
     */
    public SmartStrategy()
    {
        this.name = SmartStrategy.NAME;
    }
    
    /**
     * Geeft de locatie terug voor het opgegeven stuk
     * @param piece het te plaatsen stuk
     * @return int locatie
     */
    public int getLocationForPiece(Piece piece)
    {
        // initialisatie
        this.lastPiece = piece;
        Board board = this.client.getBoard().deepCopy();
        
        // kijken voor welk vakje we kunnen winnen
        int bestLocation = this.getWinLocation(board, piece);
        
        // er is geen vakje waar mee gewonnen kan worden
        if (bestLocation == -1)
        {
            bestLocation = this.getRandomLocation();
        }
        
        return this.lastLocation = bestLocation;
    }
    
    /**
     * Geeft het stuk terug die de tegenstander moet plaatsen, 
     * bij voorkeur waar de tegenstander niet mee kan winnen
     * @return Piece het te plaatsen stuk
     */
    public Piece getNewPiece()
    {
        // initialisatie
        Board board = this.client.getBoard().deepCopy();
        board.setPiece(this.lastLocation, this.lastPiece);
        ArrayList<Piece> pieces = board.getAvailablePieces();
        Piece worstPiece = null;
        int i = 0;
        
        // door de beschikbare stukken lopen
        while (i < pieces.size())
        {
            // heeft de tegenstander geen mogelijkheid om te winnen
            if (this.getWinLocation(board, pieces.get(i)) == -1)
            {
                // kijken of het de eerste mogelijkheid is,
                // of random toekennen
                if (worstPiece == null || Math.random() > 0.6)
                {
                    worstPiece = pieces.get(i);
                }
            }
            
            i++;
        }
        
        // de tegenstander wint met alle overgebleven stukken,
        // willekeurig eentje kiezen
        if (worstPiece == null)
        {
            worstPiece = this.getNewPiece();
        }
        
        return worstPiece;
    }
}
